/**
 * Eclipse Outliner
 * Copyright (C) 2006 Jeff Mesnil
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. 
 */
package net.jmesnil.outliner.ui.actions;

import net.jmesnil.opml.core.IOutline;
import net.jmesnil.opml.core.IOutlineNode;
import net.jmesnil.outliner.ui.editors.OutlinerEditor;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;

public class OutlineOutdentAction extends Action {

    private static final String ID = "net.jmesnil.outliner.ui.actions.OutlineOutdentAction";

    private IWorkbenchWindow window;

    public OutlineOutdentAction(IWorkbenchWindow window) {
        this.window = window;
        setId(ID);
        setActionDefinitionId(ID);
        setAccelerator(SWT.SHIFT | SWT.TAB);
        setText("Outdent");

    }

    public void run() {
        OutlinerEditor editor = (OutlinerEditor) window.getActivePage()
                .getActiveEditor();
        TreeViewer viewer = editor.getViewer();
        TreeSelection selection = (TreeSelection) viewer.getSelection();
        Object element = selection.getFirstElement();
        if (element instanceof IOutline) {
            IOutline outline = (IOutline) element;
            IOutlineNode parent = outline.getParent();
            IOutlineNode greatParent = parent.getParent();
            if (greatParent == null) {
                Display.getCurrent().beep();
                return;
            }
            boolean editing = viewer.isCellEditorActive();
            if (editing) {
                viewer.getCellModifier().modify(
                        viewer.getTree().getSelection()[0], "text",
                        editor.getTextCellEditor().getValue());
                viewer.cancelEditing();
            }
            IOutline nextSibling = outline.getNextSibling();
            while (nextSibling != null) {
                parent.removeChild(nextSibling);
                outline.appendChild(nextSibling);
                nextSibling = outline.getNextSibling();
            }
            IOutline movedOutline = outline.getParent().removeChild(outline);
            greatParent.insertAfter(movedOutline, parent);
            viewer.refresh(greatParent, true);
            viewer.setSelection(new StructuredSelection(movedOutline));
            viewer.expandToLevel(movedOutline, 1);
            viewer.reveal(movedOutline);
            if (editing) {
                viewer.editElement(movedOutline, 0);
            }
        }
    }

    public void selectionChanged(IAction action, ISelection selection) {
    }

}
